package com.qi.utils;

import com.qi.entity.Permission;
import com.qi.vo.RouterVo;
import org.springframework.beans.BeanUtils;

import java.util.ArrayList;
import java.util.List;
import java.util.Optional;

/**
 * @Description 生成菜单树
 * @Author dingchunlin
 * @Date 2024/3/15 19:19
 * @Version 1.0.0
 */
public class MenuTree {

    /**
     * 生成路由
     * @param routes 菜单列表
     * @param pid 父菜单id
     * @return
     */
    public static List<RouterVo> makeRoutes(List<Permission> routes , Long pid) {
        //创建返回信息
        List<RouterVo> routerVoList = new ArrayList<RouterVo>();
        //判断列表是否为空，如果不为空则使用菜单列表，否则创建集合对象
        Optional.ofNullable(routes).orElse(new ArrayList<Permission>())
                //筛选不为空的菜单及与菜单父id相同的数据
                .stream().filter( item -> item!=null && item.getParentId().equals(pid))
                .forEach( item -> {
                    //创建路由对象
                    RouterVo routerVo = new RouterVo();
                    routerVo.setName(item.getName());//路由名称
                    routerVo.setPath(item.getPath());//路由地址
                    //判断当前菜单是否是一级菜单
                    if (item.getParentId() == 0L){
                        routerVo.setComponent("Layout"); //一级菜单组件
                        routerVo.setAlwaysShow(true);//显示路由
                    }else {
                        routerVo.setComponent(item.getUrl()); //具体某一组件
                        routerVo.setAlwaysShow(false);//折叠路由
                    }
                    //设置Meta信息
                    routerVo.setMeta(routerVo.new Meta(item.getLabel(),item.getIcon(),item.getCode().split(",")));
                    //递归进行生成路由
                    List<RouterVo> children = makeRoutes(routes, item.getId());//子菜单
                    routerVo.setChildren(children);//设置子路由到路由对象中
                    //将路由添加到集合中
                    routerVoList.add(routerVo);
                });
        //返回路由信息
        return routerVoList;
    }

    /**
     * 生成菜单树
     * @param menuList
     * @param pid
     * @return
     */
    public static List<Permission> makeMenuTree(List<Permission> menuList , Long pid){
        List<Permission> permissionList = new ArrayList<Permission>();
        //判断列表是否为空，如果不为空则使用菜单列表，否则创建集合对象
        Optional.ofNullable(menuList).orElse(new ArrayList<Permission>())
                .stream().filter( item -> item != null && item.getParentId().equals(pid))
                .forEach( item ->{
                    //创建权限菜单对象
                    Permission permission = new Permission();
                    //将原有的属性复制给菜单对象
                    BeanUtils.copyProperties(item, permission);
                    //获取item的子菜单，递归生成菜单数
                    List<Permission> children = makeMenuTree(menuList, item.getId());
                    //设置子菜单
                    permission.setChildren(children);
                    //添加到集合
                    permissionList.add(permission);
                });
        return permissionList;
    }
}
